"use strict";
// 基本类型
// Boolean 类型
var isOk = false;
isOk = true;
// Number 类型
var decimal = 10;
var intNum = 20;
var doubleNum = 13.14;
// let bigNum: bigint = 100n;  // bigint ES2020 语法
// String
var colorBlue = "blue";
var message = "This is a message.";
// 使用模板字符串
var fullName = "Bob Bobbington";
var age1 = 30;
var sentence2 = "Hello, my name is " + fullName + ".\n\nI'll be " + (age1 + 1) + " years old next month.";
// Array
// 定义数组的第一种方式 类型[]
var array = [1, 2, 3];
// 定义数组的第二种方式 Array<类型>
var array2 = ["Hello", "TypeScript"];
// Tuple
// 元组类型：数组中的元素个数确定，元素的类型也确定
var tuple;
tuple = ["张三", 20, true];
// 枚举类型
// 默认情况下，枚举为元素从0开始编号
// 可以手动设置一个值来改变此规则
// 例如：可以 设置枚举元素从1开始编号
var Colors;
(function (Colors) {
    Colors[Colors["Red"] = 1] = "Red";
    Colors[Colors["Green"] = 2] = "Green";
    Colors[Colors["Yellow"] = 3] = "Yellow";
})(Colors || (Colors = {}));
var c = Colors.Red;
// 也可以手动设置枚举编号
var PlayerState;
(function (PlayerState) {
    PlayerState[PlayerState["Start"] = 1] = "Start";
    PlayerState[PlayerState["Suspend"] = 2] = "Suspend";
    PlayerState[PlayerState["Stop"] = 4] = "Stop";
})(PlayerState || (PlayerState = {}));
var playState = PlayerState[2];
console.log(playState); // Suspend
// Unknown
// 不知道变量时什么类型是使用 unknown 类型
var notSure1 = 4;
notSure1 = "Do you understand?";
notSure1 = false;
// error TS2322: Type 'unknown' is not assignable to type 'number'.
// 错误：不能将 unknown 类型赋值给 number
// const aNumber: number = maybe;
if (maybe === true) {
    // 添加判断之后可以赋值
    var aBoolean = maybe;
    // error TS2322: Type 'boolean' is not assignable to type 'string'.
    // 错误：不能将 boolean 类型赋值给 string
    // const aString: string = maybe;
}
if (typeof maybe === 'string') {
    var aString = maybe;
}
var value = getValue("key");
var looselyTyped = 4;
// OK, ifItExists might exist at runtime
looselyTyped.ifItExists();
// OK, toFixed exists (but the compiler doesn't check)
looselyTyped.toFixed();
var strictlyTyped = 4;
// error TS2571: Object is of type 'unknown'.
// strictlyTyped.toFixed();
// Void
// 函数中，没有返回值类型使用 void
function warnUser(message) {
    console.log("[WARN] " + message);
}
// void 类型的变量没有意义，因为只能将其赋值为 undefined
// 在没有指定 strictNullChecks 的情况下可以赋值为 null
var unusable2 = undefined;
unusable2 = undefined;
// Null and Undefined
// 默认情况下，null和undefined是所有其他类型的子类型。
// 可以将 null 和 undefined 赋值给其他类型
// 但是，在使用 --strictNullChecks 标志时，null 和 undefined 只可分配给 unknown、any
//  及其各自的类型（唯一的例外是undefined也可以赋值给void）
// 如果要传入 string、null 或 undefined，可以使用 union 类型 string | null | undefined。
var nullVar = null;
// error TS2322: Type 'undefined' is not assignable to type 'null'.
// nullVar = undefined;
var undefinedVar = undefined;
// error TS2322: Type 'null' is not assignable to type 'undefined'.
// undefinedVar = null;
// Never
// never 是函数表达式的返回类型，或总是抛出异常或从不返回的箭头函数表达式的返回类型。
function throwError(message) {
    throw new Error(message);
}
function BusinessFail() {
    return throwError("业务逻辑错误");
}
// Function returning never must not have a reachable end point
function infiniteLoop2() {
    while (true) { }
}
create({});
create(null);
create(32);
// Type assertions
// 类型断言
// 类型断言类似与其他语言中的类型转换
var someValue = "This is a string message";
// error TS2571: Object is of type 'unknown'.
// 直接写会报错
// let someLength: number = someValue.length;
// 使用类型断言
var someLength = someValue.length;
// 老版本的 <类型> 语法
var someLength2 = someValue.length;
// 类型断言的两种形式都可以选择，但是 当在 JSX 中使用 TypeScript 时，只允许使用 as 。
// About Number, String, Boolean, Symbol and Object
// 您可能会认为 Number、String、Boolean、Symbol或Object 类型与上面推荐的小写版本相同。
// 但是，这些类型不引用语言原始类型，而且几乎永远不应该用作类型
function reverse(s) {
    return s.split("").reverse().join("");
}
reverse("hello world");
// 相反，请使用类型 number、string、boolean、object和symbol。
// 推荐使用小写类型
function reverse2(s) {
    return s.split("").reverse().join("");
}
reverse("hello world");
